/**
 * 公共工具函数
 * 提供页面常用的工具方法
 */

/**
 * 更新 TabBar 选中状态
 * @param {Object} context - 页面上下文（this）
 * @param {Number} index - TabBar 索引（0-3）
 */
function updateTabBar(context, index) {
  if (typeof context.getTabBar === 'function' && context.getTabBar()) {
    context.getTabBar().setData({
      selected: index
    });
  }
}

/**
 * 检查 token 是否存在
 * @param {String} tokenKey - token 存储的 key，默认从 config 获取
 * @returns {Boolean} token 是否存在
 */
function hasToken(tokenKey) {
  const { TOKEN_STORAGE_KEY } = require('../config');
  const key = tokenKey || TOKEN_STORAGE_KEY;
  const token = wx.getStorageSync(key);
  return !!token;
}

/**
 * 格式化日期
 * @param {Date|String|Number} date - 日期对象、字符串或时间戳
 * @param {String} format - 格式，默认 'YYYY-MM-DD'
 * @returns {String} 格式化后的日期字符串
 */
function formatDate(date, format = 'YYYY-MM-DD') {
  const d = date instanceof Date ? date : new Date(date);
  
  if (isNaN(d.getTime())) {
    return '';
  }

  const year = d.getFullYear();
  const month = String(d.getMonth() + 1).padStart(2, '0');
  const day = String(d.getDate()).padStart(2, '0');
  const hour = String(d.getHours()).padStart(2, '0');
  const minute = String(d.getMinutes()).padStart(2, '0');
  const second = String(d.getSeconds()).padStart(2, '0');

  return format
    .replace('YYYY', year)
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hour)
    .replace('mm', minute)
    .replace('ss', second);
}

/**
 * 格式化时间（相对时间）
 * @param {Date|String|Number} date - 日期对象、字符串或时间戳
 * @returns {String} 相对时间字符串
 */
function formatRelativeTime(date) {
  const d = date instanceof Date ? date : new Date(date);
  
  if (isNaN(d.getTime())) {
    return '';
  }

  const now = new Date();
  const diff = now.getTime() - d.getTime();
  const seconds = Math.floor(diff / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  const days = Math.floor(hours / 24);

  if (seconds < 60) {
    return '刚刚';
  } else if (minutes < 60) {
    return `${minutes}分钟前`;
  } else if (hours < 24) {
    return `${hours}小时前`;
  } else if (days < 7) {
    return `${days}天前`;
  } else {
    return formatDate(d);
  }
}

/**
 * 获取问候语（根据时间）
 * @returns {String} 问候语
 */
function getGreeting() {
  const hour = new Date().getHours();
  if (hour >= 5 && hour < 12) {
    return '早上好';
  } else if (hour >= 12 && hour < 18) {
    return '下午好';
  } else if (hour >= 18 && hour < 22) {
    return '晚上好';
  } else {
    return '夜深了';
  }
}

/**
 * 防抖函数
 * @param {Function} fn - 要防抖的函数
 * @param {Number} delay - 延迟时间（ms），默认 300
 * @returns {Function} 防抖后的函数
 */
function debounce(fn, delay = 300) {
  let timer = null;
  return function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

/**
 * 节流函数
 * @param {Function} fn - 要节流的函数
 * @param {Number} delay - 延迟时间（ms），默认 300
 * @returns {Function} 节流后的函数
 */
function throttle(fn, delay = 300) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      fn.apply(this, args);
      lastTime = now;
    }
  };
}

/**
 * 深拷贝对象
 * @param {*} obj - 要拷贝的对象
 * @returns {*} 拷贝后的对象
 */
function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }
  
  if (obj instanceof Date) {
    return new Date(obj.getTime());
  }
  
  if (obj instanceof Array) {
    return obj.map(item => deepClone(item));
  }
  
  if (typeof obj === 'object') {
    const cloned = {};
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        cloned[key] = deepClone(obj[key]);
      }
    }
    return cloned;
  }
  
  return obj;
}

/**
 * 获取 URL 参数
 * @param {String} url - URL 字符串，默认当前页面路径
 * @returns {Object} 参数对象
 */
function getUrlParams(url) {
  const queryString = url ? url.split('?')[1] : '';
  if (!queryString) {
    return {};
  }
  
  const params = {};
  queryString.split('&').forEach(param => {
    const [key, value] = param.split('=');
    if (key) {
      params[decodeURIComponent(key)] = decodeURIComponent(value || '');
    }
  });
  
  return params;
}

/**
 * 验证手机号
 * @param {String} phone - 手机号
 * @returns {Boolean} 是否有效
 */
function validatePhone(phone) {
  const phoneRegex = /^1[3-9]\d{9}$/;
  return phoneRegex.test(phone);
}

/**
 * 验证邮箱
 * @param {String} email - 邮箱
 * @returns {Boolean} 是否有效
 */
function validateEmail(email) {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

/**
 * 格式化文件大小
 * @param {Number} bytes - 字节数
 * @returns {String} 格式化后的文件大小
 */
function formatFileSize(bytes) {
  if (bytes === 0) return '0 B';
  const k = 1024;
  const sizes = ['B', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
}

module.exports = {
  updateTabBar,
  hasToken,
  formatDate,
  formatRelativeTime,
  getGreeting,
  debounce,
  throttle,
  deepClone,
  getUrlParams,
  validatePhone,
  validateEmail,
  formatFileSize
};

